unit MainFrm;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, 
  Controls, Forms, Dialogs,StdCtrls;

type
  TMainForm = class(TForm)
    Editor: TMemo;
    procedure FormCreate(Sender: TObject);

  private
     prevChar:Char;   


    { Private declarations }
  public
     procedure AppMessage(var Msg: TMsg; 
                                                var Handled: Boolean);

    { Public declarations }
  end;


var
  MainForm: TMainForm;

implementation

{$R *.DFM}

procedure TMainForm.FormCreate(Sender: TObject);
begin
    PrevChar:=chr(0);
    Application.OnMessage:=AppMessage;
end;

procedure TMainForm.AppMessage(var Msg: TMsg; 
                                                              var Handled: Boolean);
var key:char;

begin

 if Msg.message=WM_CHAR then 
 begin
   key:=chr(Msg.wParam);  
   case key of
    '1':case prevChar of
         'a','e','o','u','y','i',   
           chr(246),chr(244):  
                              key:=chr(249);   

        'A','E','O','U','Y','I',    
          chr(214),chr(212):             
                              key:=chr(217);  
         chr(234),chr(202),
         chr(226),chr(194):
                 begin
                       PostMessage(Editor.handle,WM_CHAR,8,1);
                       PostMessage(Editor.handle,
                                                WM_CHAR,Ord(PrevChar)-1,1);

                       handled:=true;
                 end;
       end;

      '2':case prevChar  of   
              'a','e','o','u','y','i',
                chr(246),chr(244):
                                         key:=chr(248);
          
              'A','E','O','U','Y','I',
                chr(214),chr(212):
                                         key:=chr(216);

              chr(234),chr(202),
              chr(226),chr(194): begin
                        PostMessage(Editor.handle,WM_CHAR,8,1);
                        PostMessage(Editor.handle,
                                                 WM_CHAR,Ord(PrevChar)-2,1);
                        handled:=true;
                    end;
       end;

   '3':case prevChar of
          'a','e','o','u','y','i',
            chr(246),chr(244):
                               key:=chr(251);

          'A','E','O','U','Y','I',
            chr(214),chr(212):
                               key:=chr(219);

          chr(234),chr(202):
                     begin
                         PostMessage(Editor.handle,WM_CHAR,8,1);
                         PostMessage(Editor.handle,WM_CHAR,
                                                                Ord(PrevChar)+16,1);
                         handled:=true;
                     end;

          chr(226),chr(194):
                     begin
                         PostMessage(Editor.handle,WM_CHAR,8,1);
                         PostMessage(Editor.handle,WM_CHAR,
                                                                  Ord(PrevChar)+3,1);
                         handled:=true;
                     end;
       end;

   '4':case prevChar of
         'a','e','o','u','y','i',
          chr(246),chr(244):
                                key:=chr(245);

         'A','E','O','U','Y','I',
          chr(214),chr(212):
                                key:=chr(213);

          chr(234),chr(202):
                     begin
                         PostMessage(Editor.handle,WM_CHAR,8,1);
                         PostMessage(Editor.handle,WM_CHAR,
                                                                Ord(PrevChar)+18,1);
                         handled:=true;
                     end;

          chr(226),chr(194):
                     begin
                         PostMessage(Editor.handle,WM_CHAR,8,1);
                         PostMessage(Editor.handle,WM_CHAR,
                                                                   Ord(PrevChar)+1,1);
                         handled:=true;
                     end;
       end;

   '5':case prevChar of
         'a','e','o','u','y','i',
          chr(246),chr(244):
                              key:=chr(239);

         'A','E','O','U','Y','I',
          chr(214),chr(212):
                             key:=chr(207);

          chr(234),chr(202):
                     begin
                         PostMessage(Editor.handle,WM_CHAR,8,1);
                         PostMessage(Editor.handle,WM_CHAR,
                                                                 Ord(PrevChar)+1,1);
                         handled:=true;
                     end;

           chr(226),chr(194):
                     begin
                         PostMessage(Editor.handle,WM_CHAR,8,1);
                         PostMessage(Editor.handle,WM_CHAR,
                                                                      Ord(PrevChar)+2,1);
                         handled:=true;
                     end;
       end;


   '6':case prevChar of               
         'a','e','o':key:=chr(226);
         'A','E','O':key:=chr(194);
       end;

   '7':begin
         if prevChar in ['U','O','u','o'] then begin
                 PostMessage(Editor.handle,WM_CHAR,8,1);
                 handled:=true;
         end;

         case prevChar of           
            'u':PostMessage(Editor.handle,WM_CHAR,246,1);
            'U':PostMessage(Editor.handle,WM_CHAR,214,1);
            'o':PostMessage(Editor.handle,WM_CHAR,244,1);
            'O':PostMessage(Editor.handle,WM_CHAR,212,1);
         end;
       end;

   '8':case prevChar of               
         'a':key:=chr(234);
         'A':key:=chr(202);
       end;

   '9':Begin
         if prevChar in ['D','d'] then begin
                 PostMessage(Editor.handle,WM_CHAR,8,1);
                 handled:=true;
         end;

         case prevChar of              
           'd':PostMessage(Editor.handle,WM_CHAR,241,1);
           'D':PostMessage(Editor.handle,WM_CHAR,209,1);
          end;

       end;
   end;
   prevChar:=key;
   msg.wParam:=ord(key);

 end;
end;

end.
